TMS320VC5509A的存储器、系统启动与中断、时钟(PLL) | 您所在的位置:网站首页 › c55x dsp复位后的程序指针指向哪个地址 › TMS320VC5509A的存储器、系统启动与中断、时钟(PLL) |
2.片上SARAM
TMS320VC5509A的片上
S
ARAM地址范围为010000h-03FFFFh
,总共192K bytes。SARAM被分成24个block,每块8K bytes。每块SARAM每个时钟可以执行一次读写(一次读或一次写)。SARAM可以被内部程序,数据,DMA总线读取。
图二 TMS320VC5509A片上SARAM
![]() ![]() ![]() C55x支持32个ISR,中断分硬件和软件中断,软件中断由指令触发;硬件中断分片内外设触发和片内外设触发两种。根据该中断是否能被屏蔽可分为:可屏蔽中断(可以通过软件来加以屏蔽,所有的可屏蔽中断都是硬件中断,但硬件中断也不是全都能被屏蔽)和不可屏蔽中断(所有的软件中断及部分硬件中断)。 C55x在中断时DSP会自动保存ST0_55、ST1_55、ST2_55三个寄存器。 1.中断管理寄存器 图五 TMS320VC5509A终端管理寄存器![]() 2.中断向量和中断向量表 中断向量:可用来存放中断服务程序的入口地址或一个跳转指令以用来转到中断服务程序的入口地址; 中断向量地址:存放中断服务程序入口地址的内存空间地址; 中断向量表:可重新定位的且总是一会变的形式出现。C55x复位后,此表的起始地址可由用户在程序的一开始进行设置。具体可以通过函数来给ICPD和IVPH赋值。 C55x的中断向量地址为:中断向量指针IVPD(IVPH)(16位)+左移3位的中断向量序列号(0~31)。图六为中断向量序号排列的中断向量。可见由于复位中断向量是0,又由于在DSP复位后中断向量表的起始地址固定为0FFFFh,所以C55x是从FFFFF0h(此地址位于片上ROM段)开始执行程序,用户程序开始后,可以再进行中断向量表的重新定位。 图六 TMS320VC5509A中断向量表 ISR序号 硬件中断优先级 中断名称 24位中断向量地址低八位 中断子程序功能 0 0(最高) RESET 0H 复位(硬件或软件) 1 1 NMI 8H 外部不可屏蔽中断 2 2 INT0 10H 外部硬件中断0 3 5 INT2 18H 外部硬件中断2 4 6 INT0 20H 定时器0中断 5 7 RINT0 28H McBSP0接收中断 6 9 RINT1 30H McBSP1接收中断 7 10 XINT1 38H McBSP1发送中断 8 11 --- 40H 软件中断8 9 13 DMAC1 48H DMA通道1中断 10 14 DSPINT 50H 主机中断 11 15 INT3 58H 外部硬件中断3 12 17 RINT2 60H McBSP2接收中断 13 18 XINT2 68H McBSP2发送中断 14 21 DMAC4 70H DMA通道4中断 15 22 DMAC5 78H DMA通道5中断 16 4 INT1 80H 外部硬件中断1 17 8 XINT0 88H McBSP0发送中断 18 12 DMAC0 90H DMA通道0中断 19 16 INT4 98H 外部硬件中断4或RTC中断 20 19 DMAC2 A0H DMA通道2中断 21 20 DMAC3 A8H DMA通道3中断 22 23 TINT1 B0H 定时器1中断 23 24 I2C B8H I2C总线中断 24 2 BERR C0H 总线出错中断 25 25 DLOG C8H 数据记录中断 26 26(最低) RTOS D0H 实时操作系统中断 27 27 --- D8H 软件中断27 28 28 --- E0H 软件中断28 29 29 --- E8H 软件中断29 30 30 --- F0H 软件中断30 31 31 --- F8H 软件中断31需要重定位中断向量的时候,需要使用汇编语言(以外部中断的使用为例): 中断配置: 先配置一个空的中断向量表,再程序中利用csl的API函数来关联相应的中断函数到相应的中断向量上 * * Copyright (C) 2003 Texas Instruments Incorporated * All Rights Reserved * * *---------vectors_dma2.s55--------- * * Assembly file to set up interrupt vector table * .sect ".vectors" *------------------------------------------------------------------------------ * Global symbols defined here and exported out of this file *------------------------------------------------------------------------------ .global _VECSTART *------------------------------------------------------------------------------ * Global symbols referenced in this file but defined somewhere else. * Remember that your interrupt service routines need to be referenced here. *------------------------------------------------------------------------------ .ref _c_int00 .def nmi, int0, int1, int2, int3, int4, int5, int6 .def int7, int8, int9, int10, int11, int12, int13 .def int14, int15, int16, int17, int18, int19, int20 .def int21, int22, int23, int24, int25, int26, int27 .def int28, int29 _VECSTART: .ivec _c_int00,c54x_stk nmi .ivec no_isr nop_16 int0 .ivec no_isr nop_16 int1 .ivec no_isr nop_16 int2 .ivec no_isr nop_16 int3 .ivec no_isr nop_16 int4 .ivec no_isr nop_16 int5 .ivec no_isr nop_16 int6 .ivec no_isr nop_16 int7 .ivec no_isr nop_16 int8 .ivec no_isr nop_16 int9 .ivec no_isr nop_16 int10 .ivec no_isr nop_16 int11 .ivec no_isr nop_16 int12 .ivec no_isr nop_16 int13 .ivec no_isr nop_16 int14 .ivec no_isr nop_16 int15 .ivec no_isr nop_16 int16 .ivec no_isr nop_16 int17 .ivec no_isr nop_16 int18 .ivec no_isr nop_16 int19 .ivec no_isr nop_16 int20 .ivec no_isr nop_16 int21 .ivec no_isr nop_16 int22 .ivec no_isr nop_16 int23 .ivec no_isr nop_16 int24 .ivec no_isr nop_16 int25 .ivec no_isr nop_16 int26 .ivec no_isr nop_16 int27 .ivec no_isr nop_16 int28 .ivec no_isr nop_16 int29 .ivec no_isr nop_16 *------------------------------------------------------------------------------ * This is a dummy interrupt service routine used to initialize the IST. *------------------------------------------------------------------------------ .text .def no_isr no_isr: b #no_isr *------------------------------------------------------------------------------ void INTconfig() { / Temporarily disable all maskable interrupts */ IRQ_setVecs((Uint32)(&VECSTART)); / Temporarily disable all maskable interrupts */ old_intm = IRQ_globalDisable(); / Get Event Id associated with External INT1(8019), for use with */ eventId0 = IRQ_EVT_INT0; / Clear any pending INT1 interrupts */ IRQ_clear(eventId0); / Place interrupt service routine address at */ / associated vector location */ IRQ_plug(eventId0,&int1); / Enable INT1(8019) interrupt */ IRQ_enable(eventId0); / Enable all maskable interrupts */ IRQ_globalEnable(); } 程序: main() { /初始化CSL库*/ CSL_init(); /EMIF为全EMIF接口*/ CHIP_RSET(XBSR,0x0a01); /设置系统的运行速度为144MHz*/ PLL_config(&myConfig); //设置并使能5509A芯片的INT0中断(EXINT中断) INTconfig(); while(1); } //External INT0(EXINT)中断处理函数 interrupt void int1() { printf("EXINT ouccers\n"); } 设置好IVPD(IVPH)后,还需要在cmd文件里重新指明中断向量表存放在相应的位置。 参考http://www.eptw.com/bbs/viewthread.php?tid=2619 IVPD和IVPH的赋值和.CMD文件中的存储器定位有关, BOOT origin=8000h,length=00100h vectors:>BOOT,如上面定位是80H,则初始化IVPD和IVPH的值时就是MOV #0x80,mmap(IVPD)。 |
CopyRight 2018-2019 实验室设备网 版权所有 |